Allow GtkShortcutTrigger to return partial matches.
Currently, no triggers produce such results, and
GtkShortcutController treats partial matches like
exact ones.
{
GtkWidget *widget;
- if (!gtk_shortcut_trigger_trigger (gtk_shortcut_get_trigger (shortcut), event, enable_mnemonics))
+ if (gtk_shortcut_trigger_trigger (gtk_shortcut_get_trigger (shortcut), event, enable_mnemonics) == GTK_SHORTCUT_TRIGGER_MATCH_NONE)
return FALSE;
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self));
const char *type_name;
void (* finalize) (GtkShortcutTrigger *trigger);
- gboolean (* trigger) (GtkShortcutTrigger *trigger,
+ GtkShortcutTriggerMatch
+ (* trigger) (GtkShortcutTrigger *trigger,
GdkEvent *event,
gboolean enable_mnemonics);
guint (* hash) (GtkShortcutTrigger *trigger);
* value of this property is determined by checking that the passed
* in @event is a Key event and has the right modifiers set.
*
- * Checks if the given @event triggers @self. If so,
- * returns %TRUE.
+ * Checks if the given @event triggers @self.
*
- * Returns: %TRUE if this event triggered the trigger
+ * Returns: Whether the event triggered the shortcut
**/
-gboolean
+GtkShortcutTriggerMatch
gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
GdkEvent *event,
gboolean enable_mnemonics)
{
- g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (self), FALSE);
+ g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (self), GTK_SHORTCUT_TRIGGER_MATCH_NONE);
return self->trigger_class->trigger (self, event, enable_mnemonics);
}
g_assert_not_reached ();
}
-static gboolean
+static GtkShortcutTriggerMatch
gtk_never_trigger_trigger (GtkShortcutTrigger *trigger,
GdkEvent *event,
gboolean enable_mnemonics)
{
- return FALSE;
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
}
static guint
{
}
-static gboolean
+static GtkShortcutTriggerMatch
gtk_keyval_trigger_trigger (GtkShortcutTrigger *trigger,
GdkEvent *event,
gboolean enable_mnemonics)
guint keyval;
if (gdk_event_get_event_type (event) != GDK_KEY_PRESS)
- return FALSE;
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
/* XXX: This needs to deal with groups */
modifiers = gdk_event_get_modifier_state (event);
else
keyval = gdk_keyval_to_lower (keyval);
- return keyval == self->keyval && modifiers == self->modifiers;
+ if (keyval != self->keyval || modifiers != self->modifiers)
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
+
+ return GTK_SHORTCUT_TRIGGER_MATCH_EXACT;
}
static guint
{
}
-static gboolean
+static GtkShortcutTriggerMatch
gtk_mnemonic_trigger_trigger (GtkShortcutTrigger *trigger,
GdkEvent *event,
gboolean enable_mnemonics)
guint keyval;
if (!enable_mnemonics)
- return FALSE;
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
if (gdk_event_get_event_type (event) != GDK_KEY_PRESS)
- return FALSE;
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
/* XXX: This needs to deal with groups */
keyval = gdk_key_event_get_keyval (event);
else
keyval = gdk_keyval_to_lower (keyval);
- return keyval == self->keyval;
+ if (keyval != self->keyval)
+ return GTK_SHORTCUT_TRIGGER_MATCH_NONE;
+
+ return GTK_SHORTCUT_TRIGGER_MATCH_EXACT;
}
static guint
gtk_shortcut_trigger_unref (self->second);
}
-static gboolean
+static GtkShortcutTriggerMatch
gtk_alternative_trigger_trigger (GtkShortcutTrigger *trigger,
GdkEvent *event,
gboolean enable_mnemonics)
{
GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
- if (gtk_shortcut_trigger_trigger (self->first, event, enable_mnemonics))
- return TRUE;
-
- if (gtk_shortcut_trigger_trigger (self->second, event, enable_mnemonics))
- return TRUE;
-
- return FALSE;
+ return MAX (gtk_shortcut_trigger_trigger (self->first, event, enable_mnemonics),
+ gtk_shortcut_trigger_trigger (self->second, event, enable_mnemonics));
}
static guint
GTK_SHORTCUT_TRIGGER_ALTERNATIVE
} GtkShortcutTriggerType;
+/**
+ * GtkShortcutTriggerMatch:
+ * @GTK_SHORTCUT_TRIGGER_MATCH_NONE: The key event does not
+ * match the trigger
+ * @GTK_SHORTCUT_TRIGGER_MATCH_PARTIAL: The key event matches
+ * the trigger if keyboard state (specifically, the currently
+ * active group) is ignored
+ * @GTK_SHORTCUT_TRIGGER_MATCH_EXACT: The key event matches
+ * the trigger
+ *
+ * The possible return values from gtk_shortcut_trigger_trigger()
+ * describe if a key event triggers a shortcut.
+ */
+typedef enum {
+ GTK_SHORTCUT_TRIGGER_MATCH_NONE,
+ GTK_SHORTCUT_TRIGGER_MATCH_PARTIAL,
+ GTK_SHORTCUT_TRIGGER_MATCH_EXACT,
+} GtkShortcutTriggerMatch;
+
GDK_AVAILABLE_IN_ALL
GType gtk_shortcut_trigger_get_type (void) G_GNUC_CONST;
gconstpointer trigger2);
GDK_AVAILABLE_IN_ALL
-gboolean gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
+GtkShortcutTriggerMatch gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
GdkEvent *event,
gboolean enable_mnemonics);
guint keyval;
GdkModifierType state;
gboolean mnemonic;
- gboolean result[4];
+ GtkShortcutTriggerMatch result[4];
} tests[] = {
- { GDK_KEY_a, GDK_CONTROL_MASK, FALSE, { 0, 1, 0, 1 } },
- { GDK_KEY_a, GDK_CONTROL_MASK, TRUE, { 0, 1, 0, 1 } },
- { GDK_KEY_a, GDK_SHIFT_MASK, FALSE, { 0, 0, 0, 0 } },
- { GDK_KEY_a, GDK_SHIFT_MASK, TRUE, { 0, 0, 0, 0 } },
- { GDK_KEY_u, GDK_SHIFT_MASK, FALSE, { 0, 0, 0, 0 } },
- { GDK_KEY_u, GDK_SHIFT_MASK, TRUE, { 0, 0, 1, 1 } },
+ { GDK_KEY_a, GDK_CONTROL_MASK, FALSE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_EXACT, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_EXACT } },
+ { GDK_KEY_a, GDK_CONTROL_MASK, TRUE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_EXACT, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_EXACT } },
+ { GDK_KEY_a, GDK_SHIFT_MASK, FALSE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE } },
+ { GDK_KEY_a, GDK_SHIFT_MASK, TRUE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE } },
+ { GDK_KEY_u, GDK_SHIFT_MASK, FALSE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE } },
+ { GDK_KEY_u, GDK_SHIFT_MASK, TRUE, { GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_NONE, GTK_SHORTCUT_TRIGGER_MATCH_EXACT, GTK_SHORTCUT_TRIGGER_MATCH_EXACT } },
};
int i;